package com.jhy.suixianglu.daima20221210;

import java.util.Collection;
import java.util.HashMap;

/**
 * 你正在探访一家农场，农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示，
 * 其中 fruits[i] 是第 i 棵树上的水果 种类 。
 * 你想要尽可能多地收集水果。然而，农场的主人设定了一些严格的规矩，你必须按照要求采摘水果：
 * 你只有 两个 篮子，并且每个篮子只能装 单一类型 的水果。
 * 每个篮子能够装的水果总量没有限制。
 * 你可以选择任意一棵树开始采摘，你必须从 每棵 树（包括开始采摘的树）上 恰好摘一个水果 。
 * 采摘的水果应当符合篮子中的水果类型。每采摘一次，你将会向右移动到下一棵树，并继续采摘。
 * 一旦你走到某棵树前，但水果不符合篮子的水果类型，那么就必须停止采摘。
 * 给你一个整数数组 fruits ，返回你可以收集的水果的 最大 数目
 *
 * 输入：fruits = [0,1,2,2]
 * 输出：3
 * 解释：可以采摘 [1,2,2] 这三棵树。
 * 如果从第一棵树开始采摘，则只能采摘 [0,1] 这两棵树
 */
public class FruitBaskets {
    public int totalFruit(int[] fruits) {
        /**
         * 定义双指针
         * 上指针 定义起始点
         * 下指针 定义以该点的终止点。
         */
        // 定义一个上坐标
        int i = 0;
        // 定义一个列表 我们设置为初始值为2
        // TODO 之前这里我想的是用集合来做 最后用的hashmap
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        // 定义一个窗口的值
        int len = 0;
        // 将第一个标准元素先放进来 遇到相同的key value值会加一
        for (int j = 0; j < fruits.length; j++) {
            // 将每一个的数组做为key value默认为初始值为1 hashmap保证key不重复，key重复的话 改变值就好了。
            hashMap.put(fruits[j], hashMap.getOrDefault(fruits[j], 0) + 1);
            // 最大为2个篮子 一旦超过 也就是3个的时候我们就进行判断
            while (hashMap.size() > 2) {
                // 改变当前标志的位置元素的key的值 这里我们减一
                hashMap.put(fruits[i], hashMap.get(fruits[i]) - 1);
                // 如果发现map当中的标准位的值为0 证明就是3个当中没有重复的key
                // 就可以将标准位删除
                if (hashMap.get(fruits[i]) == 0) {
                    hashMap.remove(fruits[i]);
                }
                // 开启下一个标准位的计算
                i++;
            }
            // 循环结束之后 len就是当前变量的元素下标-标准位（上指针）
            len = Math.max(len, j - i + 1);
        }
        return len;
    }

    public static void main(String[] args) {
        int arr[] = {1, 2, 2, 3, 3, 5};
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            hashMap.put(arr[i], hashMap.getOrDefault(arr[i], 0) + 1);
        }
        int size = hashMap.size();
        System.out.println(size);
        Collection<Integer> values = hashMap.values();
        values.stream().forEach(System.out::println);
    }
}
